#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
编译和调用本地libs/misaki项目包的脚本

这个脚本将：
1. 从本地路径安装misaki库
2. 提供调用示例，展示如何使用misaki库的G2P功能
"""

import os
import sys
import subprocess
import time

# 获取当前脚本所在目录
current_dir = os.path.dirname(os.path.abspath(__file__))
# 构造misaki库的绝对路径
misaki_path = os.path.join(current_dir, 'libs', 'misaki')

print(f"当前工作目录: {current_dir}")
print(f"misaki库路径: {misaki_path}")

# 检查misaki目录是否存在
if not os.path.exists(misaki_path):
    print(f"错误: 找不到misaki库路径: {misaki_path}")
    sys.exit(1)

# 检查pyproject.toml文件是否存在
pyproject_file = os.path.join(misaki_path, 'pyproject.toml')
if not os.path.exists(pyproject_file):
    print(f"错误: 在{misaki_path}中找不到pyproject.toml文件")
    sys.exit(1)

# 函数：运行命令并打印输出
def run_command(command, cwd=None):
    """运行命令并打印输出"""
    print(f"执行命令: {' '.join(command)}")
    try:
        result = subprocess.run(
            command,
            cwd=cwd,
            check=True,
            stdout=subprocess.PIPE,
            stderr=subprocess.STDOUT,
            text=True
        )
        print(result.stdout)
        return True
    except subprocess.CalledProcessError as e:
        print(f"命令执行失败: {e}")
        print(e.stdout)
        return False

# 步骤1：使用pip安装本地misaki库（开发模式）
print("\n=== 步骤1：安装本地misaki库（开发模式） ===")
# 使用[en]选项安装英语支持
success = run_command(
    [sys.executable, '-m', 'pip', 'install', '-e', f'{misaki_path}[en]']
)

if not success:
    print("\n安装失败，尝试不使用开发模式直接安装...")
    success = run_command(
        [sys.executable, '-m', 'pip', 'install', f'{misaki_path}[en]']
    )
    
    if not success:
        print("\n安装仍然失败，尝试最小化安装（不包含可选依赖）...")
        success = run_command(
            [sys.executable, '-m', 'pip', 'install', '-e', misaki_path]
        )

if not success:
    print("\n错误：无法安装misaki库，请检查错误信息并手动安装。")
    sys.exit(1)

print("\n=== 步骤2：验证misaki库安装 ===")
# 尝试导入misaki库
try:
    # 先尝试导入en模块
    try:
        from misaki import en
        print("成功导入misaki.en模块")
    except ImportError:
        print("警告：无法导入misaki.en模块，可能是可选依赖未安装完全")
        
    # 尝试导入zh模块（如果有安装中文支持）
    try:
        from misaki import zh
        print("成功导入misaki.zh模块")
    except ImportError:
        print("警告：无法导入misaki.zh模块，可能未安装中文支持")
        
except ImportError as e:
    print(f"错误：无法导入misaki库: {e}")
    sys.exit(1)

print("\n=== 步骤3：使用misaki库进行G2P转换 ===")
# 尝试使用misaki库进行G2P转换
try:
    # 检查是否可以使用en模块
    if 'en' in sys.modules:
        print("\n测试英文G2P转换：")
        # 创建G2P实例（不使用transformer，美式英语）
        g2p = en.G2P(trf=False, british=False, fallback=None)
        
        # 测试文本
        text = 'Misaki is a G2P engine designed for TTS systems.'
        print(f"输入文本: {text}")
        
        # 执行G2P转换
        phonemes, tokens = g2p(text)
        
        print(f"转换结果（音素）: {phonemes}")
        print(f"转换结果（标记）: {tokens}")
    else:
        print("\n英文模块不可用，跳过英文G2P测试")
    
    # 检查是否可以使用zh模块
    if 'zh' in sys.modules:
        print("\n测试中文G2P转换：")
        # 创建中文G2P实例
        g2p_zh = zh.G2P()
        
        # 测试文本
        text_zh = '你好，这是一个中文文本到音素的转换测试。'
        print(f"输入文本: {text_zh}")
        
        # 执行G2P转换
        phonemes_zh, tokens_zh = g2p_zh(text_zh)
        
        print(f"转换结果（音素）: {phonemes_zh}")
        print(f"转换结果（标记）: {tokens_zh}")
    else:
        print("\n中文模块不可用，跳过中文G2P测试")
        print("提示：如需中文支持，请安装misaki[zh]版本")
        
    print("\n=== 完成 ===")
    print("misaki库已成功编译并调用。")
    print("\n注意事项：")
    print("1. 如需使用其他语言支持，请安装相应的可选依赖，例如：")
    print(f"   {sys.executable} -m pip install -e {misaki_path}[en,zh,ja,ko]")
    print("2. 某些功能可能需要安装espeak-ng等外部依赖")
    print("3. 更多使用示例请参考libs/misaki/examples目录")
    
except Exception as e:
    print(f"错误：在使用misaki库时发生异常: {e}")
    import traceback
    traceback.print_exc()
    
    print("\n=== 故障排除提示 ===")
    print("1. 请确保已安装所有必要的依赖")
    print("2. 检查Python版本是否在3.8-3.18范围内")
    print("3. 尝试使用管理员权限运行此脚本")
    print("4. 如需更多帮助，请查看项目文档")
    
sys.exit(1 if 'e' in locals() else 0)